function coinChange(coins, amount) {
    // 创建一个 dp 数组，初始化为 Infinity
    const dp = new Array(amount + 1).fill(Infinity)
    dp[0] = 0 // 初始化金额为 0 时的最少硬币数为 0

    // 填充 dp 数组
    for (let i = 1; i <= amount; i++) {
       for (const coin of coins) {
          if (i - coin >= 0) {
             dp[i] = Math.min(dp[i], dp[i - coin] + 1)
          }
       }
    }

    // 如果 dp[amount] 还是 Infinity，表示无法凑成该金额，返回 -1
    return dp[amount] === Infinity ? -1 : dp[amount]
 }

 // 示例测试
 console.log(coinChange([1, 2, 5], 11)) // 输出：3
 console.log(coinChange([2], 3)) // 输出：-1
 console.log(coinChange([1], 0)) // 输出：0
 console.log(coinChange([1, 3, 4, 5], 7)) // 输出：2 (3 + 4)
 console.log(coinChange([2, 5, 10, 1], 27)) // 输出：4 (10 + 10 + 5 + 2)